import { defineStore } from 'pinia'
import router from '@/router/index'
import { login, findMenuList } from '@/apis/index'
import { ref } from 'vue'
import { getUserInfo } from '@/utils/index'

const modules = import.meta.glob('./../views/**/*.vue')

// 定义一个store，如果需要使用组合式Api，则第二个参数配置的是一个函数
export const useHomeStore = defineStore('home', () => {
    let menuTree = ref([]) // 菜单树数据
    let menus = ref([]) // 后台菜单数据
    let routes = [] // 路由数据
    const isLogin = ref(getUserInfo(localStorage.getItem('token')) || false) // 是否登录
    const username = ref(getUserInfo(localStorage.getItem('token'))) // 用户名

    /**
     * 获取后来路由数据动态添加
     */
    function addRouters() {
        console.log(menuTree.value)
        // 获取菜单树
        if (isLogin.value) {
            let r = getRouter(menuTree.value)
            r.forEach(item => {
                router.addRoute('layout', item)
            })
        }
    }
    /**
     * 获取路由数据
     * @param {*后台菜单树数据} menus 
     * @returns 返回构建好的路由数据
     */
    function getRouter(menus) {
        menus.forEach(item => {
            // 有些是隐藏的路由信息
            if (item.menuType === 'M' || item.menuType === 'C' && item.path !== null) {
                let key = getKey(item.component)
                routes.push({ path: item.path, name: item.ename, component: modules[key] })
            }
            if (item.children && item.children.length > 0) {
                getRouter(item.children)
            }
        });
        return routes
    }
    /**
     * 
     * @param {*组件名称} componentStr 
     * @returns 返回组件的key
     */
    function getKey(componentStr) {
        for (const key of Object.keys(modules)) {
            if (key.includes(componentStr)) {
                // console.log(key)
                return key
            }
        }
        return ""
    }
    /**
     * 登录接口
     * @param {* 用户账号} username 
     * @param {* 用户密码} password 
     * @returns 
     */
    async function requestLogin(username, password) {
        return await login(username, password)
    }
    /**
     * 判断权限
     * @param {* 权限判断} permission 
     * @returns 
     */
    async function hasPermission(permission) {
        menus.value = await findMenuList(getUserInfo(localStorage.getItem('token')));
        // 判断权限
        const result = menus.value.some(item => item.perms && item.perms === permission);
        return result;
    }
 
    return {
        addRouters, isLogin, menuTree, menus, requestLogin, username, hasPermission
    }
}, { persist: { pick: ['username'] } })